package com.wn.service.db

import androidx.lifecycle.LiveData
import androidx.room.*
import kotlinx.coroutines.flow.Flow

/**
 * @Author: wn
 * @Date: 2023/2/21 17:21
 * @Description: dao层的定义
 * 多个 Entity 需要多个 Dao
 * 1. OnConflictStrategy.REPLACE：冲突策略是取代旧数据同时继续事务。
 * 2. OnConflictStrategy.ROLLBACK：冲突策略是回滚事务。
 * 3. OnConflictStrategy.ABORT：冲突策略是终止事务。===========默认
 * 4. OnConflictStrategy.FAIL：冲突策略是事务失败。
 * 5. OnConflictStrategy.IGNORE：冲突策略是忽略冲突。
 */
@Dao
interface UserDao {
  // 增
  @Insert(onConflict = OnConflictStrategy.REPLACE)
  suspend fun insertUser(vararg userInfo: UserInfo)

  // 删
  @Delete
  suspend fun deleteUser(userInfo: UserInfo)

  // 改
  @Update
  suspend fun updateUser(userInfo: UserInfo)

  /**
   * 条件判断： =精确判断  in多种条件的判断  like模糊的判断
   * @param uid Int
   * @return LiveData<UserInfo>  可以返回 LiveData
   */
  @Query("SELECT * FROM user_info_table where uid = :uid")
  fun queryLiveUser(uid: Int = 0): LiveData<UserInfo>

  /**
   * 返回 UserInfo  需要挂起
   * @param uid Int
   * @return UserInfo?
   */
  @Query("SELECT * FROM user_info_table where uid = :uid")
  suspend fun queryUser(uid: Int = 0): UserInfo?

  /**
   * 查 -- 降序 DESC
   * @return Flow<List<UserInfo>>  查询内置 异步 可以直接返回 flow
   */
  @Query("SELECT * FROM user_info_table ORDER BY uid ASC")
  fun queryAllUser(): Flow<List<UserInfo>>
}